Python 2分法による平方根算出

提供:yonewiki

Pythonの記事へ戻る

プログラム

平方根を手計算するには2分法というものを使いますが手計算を実際に手で計算するのは骨が折れるので、プログラムでその手順を追うための物です。あまりプログラムは得意ではないので、綺麗なコードとは言えませんが、一例を示しておきます。冒頭にあるnInputに算出したい平方根の数値を与えると2分法をnCntに与えられた深さまで算出を繰り返します。nCntが大きいほど近似値の精度が高くなります。

import numpy as np

nInput = 3

nScan = 1
while nInput > np.power(nScan, 2) :
    nScan += 1

print('nPrev: ', nScan - 1,'nNext: ', nScan)

nPrev = nScan -1
nNext = nScan

if nInput - np.power(nPrev, 2) < np.power(nNext, 2) - nInput:
    fNear = nPrev
else:
    fNear = nNext
	
print('nNear: ', fNear)

fSplit = nInput / fNear
fSplitMedian = (fSplit + fNear) / 2

fValue = (fNear + fSplitMedian) / 2

fPrepreValue = 0
fPrevValue = 0
nCnt = 12

print(nCnt,' fSplitMedian: ', fSplitMedian, 'fValue: ', fValue, 'fSplitMedian^2', np.power(fSplitMedian, 2), 'fValue^2: ', np.power(fValue, 2))
def Nibun_Func(nInput,fValue,fSplitMedian,fPrepreValue,fPrevValue,nCnt):
    if nInput > np.power(fValue, 2):
        str = '#' 
        fNear = fValue
        fValue = (fNear + fSplitMedian) / 2
        nCnt -= 1
    else:
        str = '+'
        fNear = fPrepreValue
        fSplitMedian = fValue
        fValue = (fNear + fSplitMedian) / 2
        if nInput < np.power(fValue, 2):
            fValue = fPrepreValue
    fPrepreValue = fPrevValue
    fPrevValue = fValue
    
    print(str,nCnt,' fSplitMedian: ', fSplitMedian, 'fValue: ', fValue, 'fSplitMedian^2', np.power(fSplitMedian, 2), 'fValue^2: ', np.power(fValue, 2))
    if nCnt > 0:
        Nibun_Func(nInput,fValue,fSplitMedian,fPrepreValue,fPrevValue,nCnt)
        
Nibun_Func(nInput,fValue,fSplitMedian,fPrepreValue,fPrevValue,nCnt)

累乗根も手計算できますがさらに複雑です。2項定理の累乗1から9までを使って算出する手法です。


Pythonの記事へ戻る